#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    realAnswers = 0;
    per2 = 60.0;
    per3 = 80.0;
    per4 = 90.0;

    QDir dataDir;
    QString dataPath = QDir::homePath() + "/.hseasytest/data";
    dataDir.mkpath(dataPath);
    testManager.setTestFileDir(dataPath + "/");

    tTime = new QTime(0, 0);
    timer = new QTimer(this);
    numTasksL = new QLabel(trUtf8("Всего вопросов: "), this);
    numTasks = new QLabel(trUtf8("0"), this);
    timerView = new QLabel(trUtf8("0:00"), this);
    timerView->setAlignment(Qt::AlignRight);
    ui->statusBar->addWidget(numTasksL);
    ui->statusBar->addWidget(numTasks);
    ui->statusBar->addWidget(timerView, 1);
    numTasksL->setVisible(false);
    numTasks->setVisible(false);
    timerView->setVisible(false);

    ui->btnNext->setVisible(false);
    ui->stackedWidget->setCurrentIndex(0);
    answers.append(ui->chbAnswer1);
    answers.append(ui->chbAnswer2);
    answers.append(ui->chbAnswer3);
    answers.append(ui->chbAnswer4);
    answers.append(ui->chbAnswer5);
    answers.append(ui->chbAnswer6);
    answers.append(ui->chbAnswer7);
    answers.append(ui->chbAnswer8);
    for(int i = 0; i < answers.count(); i++)
        answers.at(i)->setVisible(false);

    ui->actionOther->setDisabled(true);
    ui->actionRepit->setDisabled(true);

    ui->pbAnswers->setValue(0);
    ui->pbAnswers->setVisible(false);

    testManager.readTestsDbFromFile();
    viewTestsList();

    connect(ui->actionAboutQt, SIGNAL(triggered()), qApp, SLOT(aboutQt()));
    connect(timer, SIGNAL(timeout()), SLOT(timered()));
}

MainWindow::~MainWindow()
{
    testManager.writeTestsDbToFile();
    delete ui;
    delete tTime;
}

void MainWindow::viewTestsList()
{
    ui->lvTests->clear();
    QIcon testIcon;
    QStringList testList;

    testIcon.addPixmap(QPixmap(":/icons/test.png"));
    testList = testManager.getTestList();
    if(testList.isEmpty())
        return;
    for(int i = 0; i < testList.count(); i++)
    {
        QListWidgetItem *test = new QListWidgetItem(testIcon, testList.at(i));
        ui->lvTests->addItem(test);
    }

}

void MainWindow::showTestNode()
{
    clearNodeView();
    currentTest.next(currentNode);
    ui->labelQuestion->setText(currentNode.getQuestion());
    for(uint i = 0; i < currentNode.count(); i++)
    {
        answers[i]->setText(currentNode.getAnswers().at(i));
        answers[i]->setVisible(true);
    }
    if(currentTest.getCurrentTestNodeId() >= currentTest.count())
        ui->btnNext->setText(trUtf8("Результат"));
}

void MainWindow::clearNodeView()
{
    ui->labelQuestion->clear();
    for(int i = 0; i < 8; i++)
    {
        answers[i]->setVisible(false);
        answers[i]->setChecked(false);
    }
}

void MainWindow::showResult()
{
    float percent = 0.0;
    QString ocenka = "2";
    QString spercent = "00,00";

    percent = (float(realAnswers) * 100.0) / float(currentTest.count());
    if(percent < per2)
        ocenka = "2";
    else if(percent >= per2 && percent < per3)
        ocenka = "3";
    else if(percent >= per3 && percent < per4)
        ocenka = "4";
    else
        ocenka = "5";
    spercent.setNum(percent, 'f', 2);

    ui->labelTestName->setText(currentTest.getName());
    ui->labelTime->setText(trUtf8("Время прохождения теста: ") + timerView->text());
    ui->labelPercent->setText(trUtf8("Дано правильных ответов: ") + spercent + "%");
    ui->labeOcenka->setPixmap(QPixmap(":/images/" + ocenka + ".png"));

    ui->actionOther->setEnabled(true);
    ui->actionRepit->setEnabled(true);
    ui->btnNext->setVisible(false);
    ui->pbAnswers->setValue(0);
    ui->pbAnswers->setVisible(false);

    numTasksL->setVisible(false);
    numTasks->setVisible(false);
    timerView->setVisible(false);
}

void MainWindow::on_actionAddTest_triggered()
{
    DlgAddTest *dialog = new DlgAddTest(this);
    if(dialog->exec())
    {
        testManager.addTestFromText(dialog->getTestFileName(), dialog->getNumVis());
        testManager.writeTestsDbToFile();
        viewTestsList();
    }
}

void MainWindow::on_lvTests_clicked(const QModelIndex &index)
{
    QString testName = ui->lvTests->currentItem()->text();
    currentTest = testManager.getRunTestByName(testName);
    setWindowTitle("Hs Easy Test - " + currentTest.getName());

    numTasks->setNum(int(currentTest.count()));
    tTime->setHMS(0, 0, 0);
    timerView->setText(trUtf8("0:00"));
    numTasksL->setVisible(true);
    numTasks->setVisible(true);
    timerView->setVisible(true);
    timer->start(60000);

    showTestNode();
    ui->stackedWidget->setCurrentIndex(1);
    ui->btnNext->setVisible(true);
    ui->pbAnswers->setMaximum(currentTest.getCountVis());
    ui->pbAnswers->setVisible(true);
}

void MainWindow::on_btnNext_clicked()
{
    checkResult();
    if(currentTest.getCurrentTestNodeId() == currentTest.count())
    {
        ui->pbAnswers->setValue(ui->pbAnswers->value() + 1);
        timer->stop();
        showResult();
        ui->stackedWidget->setCurrentIndex(2);
    }
    else
    {
        ui->pbAnswers->setValue(ui->pbAnswers->value() + 1);
        showTestNode();
    }
}

void MainWindow::on_actionExit_triggered()
{
    close();
}

void MainWindow::checkResult()
{
    quint16 result = 0;
    quint32 n = currentNode.count();
    for(uint i = 0; i < n; i++)
    {
        if(answers[i]->isChecked())
            result += std::pow(2, i);
    }
    if(currentNode.checkAnswers(result))
        realAnswers++;
}

void MainWindow::on_actionAbout_triggered()
{
    QMessageBox::about(this, trUtf8("О программе"), trUtf8("<h2>Hs Easy Test 0.1</h2><p>Программа <b>Hs Easy Test</b> предназначена для тестирования учеников и студентов.</p><p>Copyright &copy;  2012 Роман Браун</p><p>Это программа является свободным программным обеспечением. Вы можете распространять и/или модифицировать её согласно условиям Стандартной Общественной Лицензии GNU, опубликованной Фондом Свободного Программного Обеспечения, версии 3 или, по Вашему желанию, любой более поздней версии.</p><p>Эта программа распространяется в надежде, что она будет полезной, но БЕЗ ВСЯКИХ ГАРАНТИЙ, в том числе подразумеваемых гарантий ТОВАРНОГО СОСТОЯНИЯ ПРИ ПРОДАЖЕ и ГОДНОСТИ ДЛЯ ОПРЕДЕЛЁННОГО ПРИМЕНЕНИЯ. Смотрите Стандартную Общественную Лицензию GNU для получения дополнительной информации.</p><p>Вы должны были получить копию Стандартной Общественной Лицензии GNU вместе с программой. В случае её отсутствия, посмотрите <a href=\"http://www.gnu.org/licenses/\">http://www.gnu.org/licenses/</a>.</p><p>E-Mail: <a href=mailto:firdragon76@gmail.com>firdragon76@gmail.com</a><br>Сайт программы: <a href=\"code.google.com/p/hs-easy-test\">code.google.com/p/hs-easy-test</a></p>"));
}

void MainWindow::on_actionOther_triggered()
{
    realAnswers = 0;
    clearNodeView();
    ui->actionOther->setDisabled(true);
    ui->actionRepit->setDisabled(true);
    ui->btnNext->setText(trUtf8("Следующий"));
    viewTestsList();
    ui->stackedWidget->setCurrentIndex(0);
}

void MainWindow::on_actionRepit_triggered()
{
    realAnswers = 0;
    clearNodeView();
    ui->actionOther->setDisabled(true);
    ui->actionRepit->setDisabled(true);
    ui->btnNext->setText(trUtf8("Следующий"));
    ui->btnNext->setVisible(true);
    currentTest.setCurrentTestNodeId(0);

    ui->pbAnswers->setValue(0);
    ui->pbAnswers->setVisible(true);
    numTasks->setNum(int(currentTest.count()));
    tTime->setHMS(0, 0, 0);
    timerView->setText(trUtf8("0:00"));
    numTasksL->setVisible(true);
    numTasks->setVisible(true);
    timerView->setVisible(true);
    timer->start(60000);

    showTestNode();
    ui->stackedWidget->setCurrentIndex(1);
}

void MainWindow::on_actionDelTest_triggered()
{
    QStringList items;
    items = testManager.getTestList();

    bool ok;
    QString item = QInputDialog::getItem(this, trUtf8("Удалить тест"), trUtf8("Тест:"), items, 0, false, &ok);
    if (ok && !item.isEmpty())
    {
        bool rem_ok = testManager.delTestByName(item);
        if(!rem_ok)
            QMessageBox::critical(this, trUtf8("Ошибка"), trUtf8("Не возможно удалить файл ") + item);
    }
    viewTestsList();
}

void MainWindow::on_actionHelp_triggered()
{
    QString curPath = QDir::currentPath();
    curPath = "file://" + curPath + "/help_rus.pdf";
    QDesktopServices::openUrl(QUrl(curPath, QUrl::TolerantMode));
}

void MainWindow::timered()
{
    int h = tTime->hour();
    int m = tTime->minute() + 1;
    if(m == 60)
    {
        h++;
        m = 0;
    }
    tTime->setHMS(h, m, 0);
    timerView->setText(tTime->toString("h:mm"));
}
